package com.hnchances.studentscoresystem.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;

/**
 * MD5加密工具类
 * 功能：对字符串（如用户密码）进行MD5加盐加密
 * 对应文档需求：user表passWord字段存储MD5加密后的密码
 */
@Slf4j
public class Md5Util {

    /**
     * 全局盐值（固定盐，生产环境可改为用户个性化盐值，如用户ID）
     * 作用：增强加密安全性，避免相同明文密码加密后结果一致
     */
    private static final String GLOBAL_SALT = "student_score_system_salt_2024";

    /**
     * MD5加密（明文+固定盐）
     * @param content 待加密内容（如用户密码明文）
     * @return MD5加密后的十六进制字符串（32位）
     */
    public static String md5Encrypt(String content) {
        if (content == null || content.trim().isEmpty()) {
            log.warn("MD5加密失败：待加密内容为空");
            throw new RuntimeException("加密内容不能为空");
        }
        // 拼接明文与盐值，增强安全性
        String encryptSource = content + GLOBAL_SALT;
        // 使用Spring内置工具类进行MD5加密
        return DigestUtils.md5DigestAsHex(encryptSource.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * MD5加密（明文+自定义盐）
     * @param content 待加密内容（如用户密码明文）
     * @param customSalt 自定义盐值（如用户ID、注册时间，推荐生产环境使用）
     * @return MD5加密后的十六进制字符串（32位）
     */
    public static String md5EncryptWithCustomSalt(String content, String customSalt) {
        if (content == null || content.trim().isEmpty()) {
            log.warn("MD5加密失败：待加密内容为空");
            throw new RuntimeException("加密内容不能为空");
        }
        if (customSalt == null || customSalt.trim().isEmpty()) {
            log.warn("MD5加密失败：自定义盐值为空，默认使用全局盐");
            return md5Encrypt(content);
        }
        // 拼接明文与自定义盐值
        String encryptSource = content + customSalt;
        return DigestUtils.md5DigestAsHex(encryptSource.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 密码校验（明文密码加密后与数据库存储的加密密码比对）
     * @param plainPassword 明文密码（用户登录时输入）
     * @param encryptedPassword 数据库存储的加密密码（MD5）
     * @return true-密码一致，false-密码不一致
     */
    public static boolean verifyPassword(String plainPassword, String encryptedPassword) {
        String encryptedPlain = md5Encrypt(plainPassword);
        return encryptedPlain.equals(encryptedPassword);
    }

    /**
     * 密码校验（支持自定义盐值）
     * @param plainPassword 明文密码
     * @param encryptedPassword 数据库存储的加密密码
     * @param customSalt 自定义盐值（与加密时使用的盐值一致）
     * @return true-密码一致，false-密码不一致
     */
    public static boolean verifyPasswordWithCustomSalt(String plainPassword, String encryptedPassword, String customSalt) {
        String encryptedPlain = md5EncryptWithCustomSalt(plainPassword, customSalt);
        return encryptedPlain.equals(encryptedPassword);
    }
}